package org.leiyang.netty.listener;

import io.netty.channel.ChannelHandlerContext;
import org.leiyang.common.dtos.Message;
import org.leiyang.common.dtos.MessageType;
import org.leiyang.common.dtos.R;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

/**
 * 心跳包的处理
 * 心跳探测的作用:在某些网络环境下，如果长时间没有数据传输，连接可能会被网络设备（如路由器或防火墙）自动断开。定期发送心跳包可以防止这种情况发生
 */
@Component
@Order(3)
public class PongFilter implements INettyMsgFilter {
    @Override
    public Mono<Boolean> chain(Message message, ChannelHandlerContext ctx, String serverIp, String port, Boolean httpFormat) {
        if(message.getMessageType() == MessageType.PONG) {
            logger.info("收到来自用户({})的心跳包消息....", message.getFromUserId());
            //不做任何处理，直接返回响应信息
            sendResponse(ctx, R.ok(null, "pong"), channelHandlerContext -> {}, httpFormat);
            return Mono.just(false);
        }
        return Mono.just(true);
    }
}
